import axios from 'axios';
import config from '../config';
import { ElMessage } from 'element-plus';
// 引入vuex存储的信息
import store from '../store';
import router from '../router';

const REQUEST_ERROR = '请求异常，请稍后重试'

// 创建一个axios实例对象
const service = axios.create({
  baseURL: config.baseApi
  // baseURL: '/api2'
})

// 添加请求拦截器
service.interceptors.request.use(
  (req) => {
    // jwt-token认证时，header加上token
    req.headers['token'] = store.state.user.token
    // 打印请求信息
    config.log ? console.log('请求信息：\n', req) : 0;
    return req
  }
)

// 添加响应拦截器
service.interceptors.response.use(
  (res) => {
    // 打印响应结果
    config.log ? console.log('响应结果：\n', res) : 0;
    // 根据前后端协商而定
    if (res.data.status === 200) {
      return res;
    } else {
      // 请求错误，以及错误信息
      ElMessage.error({
        showClose: true,
        message: (res.data.message || REQUEST_ERROR) + " " + res.data.moreInfo,
      })

      // 20001登录过期或失效
      if (res.data.status === 20001) {
        store.commit('user/clearAuth');
        router.push('/login');
      }

      return Promise.reject(res.data.message || REQUEST_ERROR)
    }
  },
  (error) => {
    // 异常状态和状态码
    console.log('错误：\n', error)
    // 优先选择使用后端传来的错误信息（如果有的话）
    if (error.response && error.response.data) {
      error.message = error.response.data.message
    }

    // 500
    if (error.code === "ERR_NETWORK" || error.response.status === 500) {
      // 错误信息，弹窗时间4000ms
      ElMessage.error({
        showClose: true,
        message: "服务器无响应或响应错误，请稍后重试",
        duration: 4 * 1000
      })
    }

    return Promise.reject(error)
  }
)

/**
 * 封装get方法
 * 
 * @param url 请求路径
 * @param params 请求的params
 * @param mock 传入一个布尔值表示该接口是否开启mock
 * 
 * @returns {Promise} Promise，兑现时返回data: {status: , message: , moreInfo: , data: { }}
 */
export function get(url, params = {}, mock = null) {
  // 对mock的处理
  let isMock = config.mock
  if (mock !== null) {
    // 允许单个请求接口不同于总开关的设置
    isMock = mock
  }
  console.log('config.env: ', config.env);
  // 对线上环境做处理
  if (config.env === 'production') {
    // 不允许有用到mock的机会
    service.defaults.baseURL = config.baseApi;
  } else {
    service.defaults.baseURL = isMock ? config.mockApi : config.baseApi
  }
  // 发送请求
  return new Promise((resolve, reject) => {
    service.get(url, {
      params: params
    })
      .then(response => {
        // 注意这直接返回data
        resolve(response.data);
      })
      .catch(err => {
        reject(err)
      })
  })
}

/**
 * 封装post请求
 * 
 * @param url 请求路径
 * @param data 请求的data
 * @param mock 传入一个布尔值表示该接口是否开启mock
 * 
 * @returns {Promise} Promise，兑现时返回data: {status: , message: , moreInfo: , data: { }}
 */
export function post(url, data = {}, mock = null) {
  // 对mock的处理
  let isMock = config.mock
  if (mock !== null) {
    // 允许单个请求接口不同于总开关的设置
    isMock = mock
  }
  console.log('config.env: ', config.env);
  // 对线上环境做处理
  if (config.env === 'production') {
    // 不允许有用到mock的机会
    service.defaults.baseURL = config.baseApi
  } else {
    service.defaults.baseURL = isMock ? config.mockApi : config.baseApi
  }
  // 发送请求
  return new Promise((resolve, reject) => {
    service.post(url, data)
      .then(response => {
        // 注意这直接返回data
        resolve(response.data);
      }, err => {
        reject(err)
      })
  })
}

export default {
  get,
  post,
}